
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>자바 표준 태그 라이브러리:JSTL</title>
</head>
<body>
	<h1>자바 표준 태그 라이브러리:JSTL</h1>
	<h3>개요</h3>

	<p>맵이나 콜렉션의 항목 순회, 조건에 따라 실행, XML처리, DB접근 및 조작 등의 일반적인 작업을 처리하는 사용자
		정의 태그 라이브러리의 집합을 의미</p>

	<p>jstl.java.net에서 API, implementation을 다운로드</p>

	<p>다운로드 받은 파일은 WEB-INF/lib에 저장하고 taglib 지시문으로 해당 라이브러리의 접두사와 uri를
		정의</p>

	<h3>JSTL구성</h3>
	<p>core: 변수지원, 흐름제어, URL관리 및 기타</p>
	<p>i18n: 인코딩처리, 날짜, 시간 표기</p>
	<p>functions: 콜렉션, 문자열 처리를 위한 다양한 메서드 지원 접두사는 fn</p>
	<p>sql: 데이터베이스 접근 및 처리 지원, 접두사는 sql</p>
	<p>xml: xml접근 및 처리 지원, 접두사는 xml</p>

	<hr />
	<h3>core</h3>
	<p>
		c:out-표현식을 평가하고 결과를 JspWriter로 출력 <br /> JSP2.x에서는 $&#123;}를 더 많이 사용<br />
		하지만, 변수 값에 태그가 포함된 경우 xml escaping을 위해 여전히 out태그를 사용
	</p>
	<p>xml escaping: XSS공격을 방지하기 위해 태그들을 특수문자로 변환하는 것을 의미</p>
	<p>c:set: 문자열 객체 생성 및 객체 유효범위지정</p>
	<p>c:remove: 문자열 객체 제거</p>
	<hr />
	<h3>예제) c:set, c:remove</h3>
	<p>
		스크립트릿:
		<%="최정은입니당"%></p>
	<p>
		c:out-
		<c:out value="최정은입니당" />
	</p>

	<p>
		스크립트릿:
		<%
		String msg = "<p style='color:red'>최정은입니다~</p>";
		out.println(msg);
	%>
	</p>
	<p>
		c:set-
		<c:set var="msg" value="최정은입니다~" />
		<c:out value="${msg}" />
		보다는 ${msg} 추천
	</p>

	<!--<c:out value="${msg }"/> 해킹방지-->
	<p>
		c:set-
		<c:set var="msg" value="<p style='color:red'>최정은~</p>" />${msg }보다는
		<c:out value="${msg }" />
		추천
	</p>
	<p>
		XSS테스트:
		<c:set var="xss" value="<script>alert('헤헤헤');</script>" />
	</p>
	${xss}
	<c:set var="xss2" value="<script> while(true){alert('헤헤헤');}</script>" />
	${xxs2}
	<!--<c:out value="${xss2 }" escapeXml="false"/>-->
	<c:out value="${xss2 }" />
	<p>
		c:remove-
		<c:remove var="xss" />
		<c:remove var="xss2" />
		<c:remove var="msg" />
		${xss}${xss2}${msg}
	</p>
	<p>
		c:remove-
		<c:remove var="xss2" />
		${xss}
	</p>
	<p>
		c:remove-
		<c:remove var="msg" />
		${xss}
	</p>

	<hr />
	<h3>if, choose, when, otherwise, forEach</h3>
	<p>if: 조건검사 태그, if문을 태그화 함</p>
	<p>choose, when, otherwise: 다중조건 검사, switch문을 태그화 함</p>
	<p>forEach: 반복처리 태그, for문을 태그화 함</p>
	<p>forEach-var:반복처리시 사용할 변수를 정의하는 속성</p>
	<p>forEach-varStatus:forEach의 상태를 확인할 수 있음, count(반복횟수 표시),
		last(마지막인지 검사), first(처음인지 검사), index(위치값:items속성의 위치 표시,0부터 시작),
		current(현재 forEach처리 번호)등 을 사용 가능</p>

	<hr />
	<h3>예제) if,forEach</h3>
	<%--JSTL.jsp?uid=abc&pwd=987 --%>
	<%
		if (request.getParameter("uid") != null
				&& request.getParameter("pwd") != null) {
			if (request.getParameter("uid").equals("abc")
					&& request.getParameter("pwd").equals("987")) {
				out.println("로그인 성공!!");
			}
		}
	%>
	<%--JSTL.jsp?uid=xyz&pwd=123 --%>
	<p>
		<c:if test="${param.uid eq 'xyz' and param.pwd eq '123'}">
			<span style="color: red">로그인 성공!!</span>
		</c:if>
	</p>
	<p>
		<c:if test="${param.uid ne 'xyz' or param.pwd ne '123'}">
			<span style="color: blue">로그인 실패!!</span>
		</c:if>
	</p>

	<p>
		<c:if test="${param.uid eq 'abc' and param.pwd eq '123'}"
			var="loginCheck" />
		${(loginCheck)?"로그인 성공!":"로그인 실패!"}
	</p>
	<%-- mtype: 1(member), 2(guest) --%>
	<%-- member: 정회원입니다!, guest:손님입니다! --%>
	<%-- 나머지 - 로그인하세요! --%>
	<p>
		<c:if test="${param.mtype eq '1'}">
			<span style="color: black">정회원입니다</span>
		</c:if>
	</p>
	<p>
		<c:if test="${param.mtype eq '2'}">
			<span style="color: black">손님입니다</span>
		</c:if>
	</p>
	<p>
		<c:if test="${param.mtype ne '1' and  param.mtype ne '2'}">
			<span style="color: black">로그인하세요!</span>
		</c:if>
	</p>

	<p>
		<c:choose>
			<c:when test="${param.mtype eq 1}"> 정회원입니다. </c:when>
			<c:when test="${param.mtype eq 2 }"> 손님입니다.</c:when>
			<c:otherwise> 로그인하세요! </c:otherwise>
		</c:choose>
	</p>

	<p>
		<%
			for (int i = 1; i <= 10; ++i)
				out.println(i);
		%>
		<c:forEach var="i" begin="1" end="10" step="1">${i}</c:forEach>
	</p>
	<p>
		<%
			for (int j = 10; j >= 1; j--)
				out.println(j);
		%><br />
		<c:forEach var="j" begin="1" end="10" step="1" varStatus="status">
	
	${11-j}:${status.count}/${status.first}
			/${status.last}/${status.current}
			/${status.index}/${status.begin}
			/${status.end}/${status.step}<br />
		</c:forEach>
	</p>
	<p>
		<c:forEach var="i" begin="1" end="20" step="1" varStatus="status">
	${status.end-i +1}&nbsp;
	</c:forEach>
	</p>

	<p>
		<%
			List<String> foods = new ArrayList<>();
			foods.add("초코빵");
			foods.add("피자");
			foods.add("우동");
			foods.add("햄버거");
			foods.add("치킨");
			//pageContext.setAttribute("foods", foods);

			for (String f : foods)
				out.println(f);

			for (int i = 0; i < foods.size(); ++i) {
				String f = foods.get(i);
				out.println(f);
			}
		%>
		<br />
		<!-- foods에 들어있는 값들을 하나씩 가져옴 -->
		<c:forEach var="f" items="<%=foods%>">
	 ${f} &nbsp;
	 </c:forEach>
	</p>

	<p>
		<%
			Map<String, String> member = new HashMap<String, String>();
			member.put("1", "수지");
			member.put("2", "혜교");
			member.put("3", "지현");
		%>
		<c:forEach var="m" items="<%=member%>">
	 ${m} <br /> ${m.key} <br /> ${m.value} <br />
		</c:forEach>
	</p>
	<hr />
	<h3>URL</h3>
	<p>url: 주소 및 질의 문자열 작성을 쉽게 할 수 있음.</p>
	<p>질의문자열은 param 태그를 추가적으로 작성해야 함.</p>
	<p>redirect: 페이지 이동을 제어하는 태그, 클라이언트에게 지정한 url로 요청하도록 지시함.</p>
	<hr />
	<h3>예제)url</h3>
	<p>
		<c:url var="google" value="http://google.co.kr" />
		<a href="${google}"> 링크테스트1</a>
		<c:url var="el" value="./EL.jsp" />
		<a href="${el}">링크테스트2</a>
		<c:url var="jstl" value="./JSTL.jsp?uid=123&pwd=xyz" />
		<a href="${jstl}">링크테스트3a</a>

		<c:url var="jstl2" value="./JSTL.jsp">
			<c:param name="uid" value="abc" />
			<c:param name="pwd" value="987" />
		</c:url>
		<a href="${jstl2}">링크테스트3b</a>
	</p>

	<h3>링크 자동생성기 예제</h3>
	<p>구글- http://google.co.kr</p>
	<p>다음- http://daum.net</p>
	<p>파코즈- http://parkoz.com</p>
	<p>위 내용을 토대로 ArrayList, forEach, url등을 이용해서 링크를 생성하세요</p>

	<%
		List<String> url1 = new ArrayList<>();
		url1.add("구글|http://google.co.kr");
		url1.add("다음|http://daum.net");
		url1.add("파코즈|http://parkoz.com");
	%>

	<c:set var="url1" value="<%=url1%>" />
	<c:forEach var="u1" items="${url1}">
		<%-- <c:forEach var="txt" items="${fn:split(u1,'|')}"> --%>
			<%--u1에 있는 것 중에 첫 번째 값--%>
			<c:url var="u" value="${fn:split(u1,'|')[1]}"/>
			<a href="${u}">${fn:split(u1, '|')[0]}</a>
		<%-- </c:forEach> --%>
	</c:forEach>

	<hr/>

	<%
		Map<String, String> url2 = new HashMap<String, String>();
		url2.put("구글", "http://google.co.kr");
		url2.put("다음", "http://daum.net");
		url2.put("파코즈", "http://parkoz.com");
	%>
	<c:forEach var="u2" items="<%=url2%>">
		<c:url var="u" value="${u2.value }" />
		<a href="${u}">${u2.key}</a>
	</c:forEach>



</body>
</html>